package com.phrp.controller;

import com.phrp.entity.ManagerUser;
import com.phrp.entity.vo.ManagerUserSearchDataVo;
import com.phrp.exception.CustomizationException;
import com.phrp.service.ManagerUserService;
import com.phrp.util.jwt.JwtUtil;
import com.phrp.util.returnResult.ResponseResult;
import com.phrp.util.returnResult.ReturnInfoEnum;
import com.phrp.dao.ManagerUserDao;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author ssc
 * @since 2024-04-20
 */
@RestController
@RequestMapping("/managerUser")
public class ManagerUserController {
    @Autowired
    private ManagerUserService managerUserService;

    @Autowired
    private ManagerUserDao managerUserDao;

    @Autowired
    private JwtUtil jwtUtil;

    /*
     * 在Controller中，有几种返回值类型：
     * String：表示返回一个视图的逻辑视图名称。这个返回值可以是视图的逻辑名称和重定向或转发的路径。
     * void：不返回任何内容，这种情况通常用于执行某些操作而不需要返回具体的数据或视图。
     * ModelAndView：是Spring MVC中常用的返回类型，它可以同时包含模型数据和视图名称，用于返回数据和指定视图。
     * ModelMap：是Spring MVC中用于传递模型数据的容器，通常与@ModelAttribute注解一起使用，用于向视图传递数据。
     * Map或Model：用于向视图传递模型数据。
     * 还有其他自定义内容。
     */

    /**
     * 登录
     * @param managerUser
     * @return
     */
    @PostMapping(value = "login")
    public ResponseResult login(@RequestBody ManagerUser managerUser) {
        // 搜索解释是jwt拦截会在controller中，就不会执行service层的代码，所以将逻辑移到controller中

        // 将密码加密
        Md5Hash md5Pwd = new Md5Hash(managerUser.getPassword(), managerUser.getPhone(), 1024);

        ManagerUser mUser = managerUserDao.getByPhone(managerUser.getPhone());

        if (mUser == null || !md5Pwd.toHex().equals(mUser.getPassword()) ) {
            // 用户名或密码错误
            return new ResponseResult(ReturnInfoEnum.USERINFO_ERROR);
        }

        // 身份验证通过，刷新登录时间
        managerUser.setLastLogTime(LocalDateTime.now());

        // 得到上一次登录时间
        String logTime = String.valueOf(mUser.getLastLogTime());

        // 更新登录时间
        Integer i = managerUserDao.updateByPhone(managerUser);

        if (i != 1) {
            // 更新失败，数据库错误，抛出异常
            throw new CustomizationException(ReturnInfoEnum.DATA_FAIL);
        }

        // 更新成功
        // 获取token，并将其返回给前端
        String token = jwtUtil.generateToken(managerUser.getPhone());

        HashMap<String, String> map = new LinkedHashMap<>();
        map.put("token", token);
        map.put("logTime", logTime);
        map.put("position",mUser.getPosition());
        return new ResponseResult<HashMap>(ReturnInfoEnum.SUCCESS, map);
    }

    /**
     * 增加用户
     * @param managerUser
     * @return
     */
    @PutMapping(value = "addUser")
    public ResponseResult addUser(@RequestBody ManagerUser managerUser) {
        return managerUserService.addManagerUser(managerUser);
    }

    /**
     * 获取用户信息
     * @return
     */
    @GetMapping(value = "getPersonMsg")
    public ResponseResult<ManagerUser> personMessage() {
        return managerUserService.personMessage();
    }

    /**
     * 检验token是否有效
     * @return
     */
    @GetMapping(value = "tokenCheck")
    public ResponseResult tokenCheck(){
        return managerUserService.tokenCheck();
    }

    /**
     * 修改个人信息
     * @param mUser
     * @return
     */
    @PostMapping(value = "changeMessage")
    public ResponseResult changeMessage(@RequestBody ManagerUser mUser){
        return managerUserService.changeMessage(mUser);
    }

    /**
     * 修改密码
     * @param message
     * @return
     */
    @PostMapping(value = "changePwd")
    public ResponseResult changePwd(@RequestBody ManagerUser message){
        return managerUserService.changePwd(message);
    }

    /**
     * 搜索管理用户数据
     * @param searchData
     * @return
     */
    @PostMapping(value = "searchManagerUsers")
    public ResponseResult searchManagerUsers(@RequestBody ManagerUserSearchDataVo searchData){
        return managerUserService.searchManagerUsers(searchData);
    }

    /**
     * 重置用户密码
     * @return
     */
    @PostMapping(value = "resetPassword")
    public ResponseResult resetPassword(@RequestBody LinkedList<ManagerUser> managerUsers){
        return managerUserService.resetPassword(managerUsers);
    }

    /**
     * 修改职位
     * @param id
     * @param position
     * @return
     */
    @GetMapping(value = "changePosition")
    public ResponseResult changePosition(@RequestParam("id") String id,@RequestParam("position")String position){
        return managerUserService.changePosition(id,position);
    }

    /**
     * 删除用户信息
     * @param ids
     * @return
     */
    @PostMapping(value = "deleteManagerUser")
    public ResponseResult deleteManagerUser(@RequestBody LinkedList<String> ids){
        return managerUserService.deleteManagerUser(ids);
    }

    /**
     * 添加账户
     * @param managerUser
     * @return
     */
    @PostMapping(value = "addManagerUser")
    public ResponseResult addManagerUser(@RequestBody ManagerUser managerUser){
        return managerUserService.addManagerUser(managerUser);
    }

    /**
     * 修改账户状态
     * @param id
     * @param status
     * @return
     */
    @GetMapping(value = "updateStatus")
    public ResponseResult updateStatus(@RequestParam String id,@RequestParam String status){
        return managerUserService.updateStatus(id,status);
    }

    /**
     * 获取巡查员数据
     * @param inspectorSearch
     * @return
     */
    @PostMapping(value = "getInspector")
    public ResponseResult getInspector(@RequestBody ManagerUserSearchDataVo inspectorSearch){
        return managerUserService.getInspector(inspectorSearch);
    }

}
